Les facettes sont dépréciés depuis la version 1.5 au profit d'aggregations (voir plus bas).
La recherche à facettes (ou recherche facettée, ou navigation à facettes) est une technique en recherche d'information correspondant à une méthodologie d'accès à l'information basée sur une classification à facettes. Elle donne aux utilisateurs les moyens de filtrer une collection de données en choisissant un ou plusieurs critères (les facettes). Il n'est donc pas tant question de recherche que de filtrage (une recherche brute, taxonomique, pouvant être utilisée en complément). Une classification à facettes associe à chaque donnée de l'espace de recherche un certain nombre d'axes explicites de filtrage, par exemple des mots clés issus d'une analyse texte, des métadonnées stockées dans une base de données, etc. On trouve par exemple des recherches à facettes basées sur des catégories sur de nombreux sites de e-commerce.
{
"query": {
"match_all": {}
},
"facets": {
"tags": {
"terms": {
"field": "nom",
# Le nombre de facette retournés
"size":"10"
}
}
}
}
La facette va nous retourner plusieurs résultats :
"_type": "terms", # Type de facette
"missing": 66113, # Nb de résultat sans le term
"total": 0, # Le nb de résultat compté
"other": 0, # Le nb de facette compté mais pas retourné
"terms": [ ] # La liste des facettes
Déprécié depuis la version 1.5 au profit des aggregations.
Il existe plusieurs type d'aggregations, certaines restes encore experimentales et risquent d'être supprimés dans des releases futures. Toute ne sont pas abordés ici, pour plus d'informations
{
"aggs" : {
"min_price" : { "min" : { "field" : "price" } }
}
}
{
"aggs" : {
"max_price" : { "max" : { "field" : "price" } }
}
}
{
"query" : {
"filtered" : {
"query" : { "match_all" : {}},
"filter" : {
"range" : { "timestamp" : { "from" : "now/1d+9.5h", "to" : "now/1d+16h" }}
}
}
},
"aggs" : {
"intraday_return" : { "sum" : { "field" : "change" } }
}
}
{
"aggs" : {
"avg_grade" : { "avg" : { "field" : "grade" } }
}
}
{
"aggs" : {
"grades_stats" : { "stats" : { "field" : "grade" } }
}
}
{
...
"aggregations": {
"grades_stats": {
"count": 6,
"min": 60,
"max": 98,
"avg": 78.5,
"sum": 471
}
}
}
On a également la possiblité de faire des stats un peu plus poussée à l'aide de l'aggregation extended_stat (en obtenant la variance, la déviance, etc).
{
"aggs" : {
"grades_stats" : { "extended_stats" : { "field" : "grade" } }
}
}
{
...
"aggregations": {
"grade_stats": {
"count": 9,
"min": 72,
"max": 99,
"avg": 86,
"sum": 774,
"sum_of_squares": 67028,
"variance": 51.55555555555556,
"std_deviation": 7.180219742846005,
"std_deviation_bounds": {
"upper": 100.36043948569201,
"lower": 71.63956051430799
}
}
}
}
{
"aggs" : {
"load_time_outlier" : {
"percentiles" : {
"field" : "load_time"
}
}
}
}
{
"aggs" : {
"author_count" : {
"cardinality" : {
"field" : "author"
}
}
}
}
{
"query" : {
"match" : { "business_type" : "shop" }
},
"aggs" : {
"viewport" : {
"geo_bounds" : {
# Le champ qui va permettre d'obtenir la zone de délimitation
"field" : "location",
"wrap_longitude" : true
}
}
}
}
{
"aggs": {
"top-tags": {
"terms": {
"field": "tags",
"size": 3
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"sort": [
{
"last_activity_date": {
"order": "desc"
}
}
],
"_source": {
"include": [
"title"
]
},
"size" : 1
}
}
}
}
}
}
# et le résultat
"aggregations": {
"top-tags": {
"buckets": [
{
"key": "windows-7",
"doc_count": 25365,
"top_tags_hits": {
"hits": {
"total": 25365,
"max_score": 1,
"hits": [
{
"_index": "stack",
"_type": "question",
"_id": "602679",
"_score": 1,
"_source": {
"title": "Windows port opening"
},
"sort": [
1370143231177
]
}
]
}
}
},
{
"key": "linux",
"doc_count": 18342,
"top_tags_hits": {
"hits": {
"total": 18342,
"max_score": 1,
"hits": [
{
"_index": "stack",
"_type": "question",
"_id": "602672",
"_score": 1,
"_source": {
"title": "Ubuntu RFID Screensaver lock-unlock"
},
"sort": [
1370143379747
]
}
]
}
}
},
{
"key": "windows",
"doc_count": 18119,
"top_tags_hits": {
"hits": {
"total": 18119,
"max_score": 1,
"hits": [
{
"_index": "stack",
"_type": "question",
"_id": "602678",
"_score": 1,
"_source": {
"title": "If I change my computers date / time, what could be affected?"
},
"sort": [
1370142868283
]
}
]
}
}
}
]
}
}
{
"aggs" : {
"in_stock_products" : {
"filter" : { "range" : { "stock" : { "gt" : 0 } } },
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}
}
{
...
"aggs" : {
"in_stock_products" : {
"doc_count" : 100,
"avg_price" : { "value" : 56.3 }
}
}
}
{
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"errors" : { "term" : { "body" : "error" }},
"warnings" : { "term" : { "body" : "warning" }}
}
},
"aggs" : {
"monthly" : {
"histogram" : {
"field" : "timestamp",
"interval" : "1M"
}
}
}
}
}
}
{
"query": {
"match_all":{}
},
"aggs": {
"tags": {
"nested": {
"path":"tags"
},
"aggs": {
"abel":{
"terms": { "field":"tags.label" }
}
}
}
}
}
{
"aggs" : {
"genders" : {
"terms" : { "field" : "gender" }
}
}
}
# Créer moi un histogramme des articles ayant un prix sur un interval de 50
{
"aggs" : {
"prices" : {
"histogram" : {
"field" : "price",
"interval" : 50
}
}
}
}
Résultat
...
{
"aggregations": {
"prices" : {
"buckets": [
{
"key": 0,
"doc_count": 2
},
# 4 documents au prix de 50
{
"key": 50,
"doc_count": 4
},
{
"key": 150,
"doc_count": 3
}
]
}
}
}
On constate ici que 100 n'est pas affiché (probablement du au fait qu'aucun résultat est retourné), pour palier à ça il est nécessaire d'ajouter ce paramètre à la requête après interval : "min_doc_count" : 0